package com.sh.bean;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * 资源用户实体类，实现了 UserDetails 接口以便与 Spring Security 集成。
 */
@Data
@TableName("resuser")
public class Resuser implements Serializable, UserDetails {

    /**
     * 用户 ID，设置为自增类型。
     */
    @TableId(type = IdType.AUTO)
    private Integer userid;

    /**
     * 用户名，对应数据库表中的 username 字段。
     */
    @TableField("username")
    private String username;

    /**
     * 用户密码，这里的名称和数据库中的不相等是因为 UserDetails 接口要求密码必须叫 password。
     */
    @TableField("pwd")
    private String password;

    /**
     * 用户邮箱，对应数据库表中的 email 字段。
     */
    @TableField("email")
    private String email;

    /**
     * 用户角色，默认值为 "user"，通过这个字段来确定用户的权限。
     * 该字段在数据库表中不存在，仅在代码中使用。
     */
    @TableField(exist = false)
    private String role = "user";

    /**
     * 实现 UserDetails 接口的方法，返回用户密码。
     * @return 用户密码
     */
    @Override
    public String getPassword() {
        return password;
    }

    /**
     * 实现 UserDetails 接口的方法，返回用户名。
     * @return 用户名
     */
    @Override
    public String getUsername() {
        return username;
    }

    /**
     * 实现 UserDetails 接口的方法，返回用户所拥有的权限列表。
     * @return 用户权限列表，这里根据用户的角色生成一个权限对象列表。
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return List.of(new SimpleGrantedAuthority(role));
    }

    /**
     * 实现 UserDetails 接口的方法，判断用户账户是否未过期。
     * @return 总是返回 true，表示账户未过期。
     */
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    /**
     * 实现 UserDetails 接口的方法，判断用户账户是否未被锁定。
     * @return 总是返回 true，表示账户未被锁定。
     */
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    /**
     * 实现 UserDetails 接口的方法，判断用户凭证是否未过期。
     * @return 总是返回 true，表示凭证未过期。
     */
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    /**
     * 实现 UserDetails 接口的方法，判断用户账户是否已启用。
     * @return 总是返回 true，表示账户已启用。
     */
    @Override
    public boolean isEnabled() {
        return true;
    }
}